package org.example.utils;

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * Timestamp时间工具类
 *
 */
public class DateUtil {

    /**
     * yyyy-MM-dd 格式时间
     */
    public static SimpleDateFormat DATE = new SimpleDateFormat("yyyy-MM-dd");

    /**
     * yyyy-MM-dd HH:mm:ss 格式时间
     */
    public static SimpleDateFormat TIME = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 获取当前时间
     *
     * @param time
     * @return
     */
    public static Timestamp getNowTime(long time) {
        return new Timestamp(time);
    }

    /**
     * 获取当前时间
     *
     * @param date
     * @return
     */
    public static Timestamp getNowTime(Date date) {
        return new Timestamp(date.getTime());
    }

    /**
     * 获取当前时间
     *
     * @return
     */
    public static Timestamp getNowTime() {
        return new Timestamp(System.currentTimeMillis());
    }


    /**
     * 获取当时时间的字符串
     *
     * @param format
     * @return
     */
    public static String getNowTimeFormat(SimpleDateFormat format) {
        if (format == null) {
            return getByFormat(getNowTime(), TIME);
        }
        return getByFormat(getNowTime(), format);
    }

    /**
     * 获取指定时间格式
     *
     * @param date   时间
     * @param format 格式
     * @return
     */
    public static String getByFormat(Date date, SimpleDateFormat format) {
        if (null == date) {
            return "";
        }
        return format.format(date);
    }


    /**
     * 将字符串转为指定格式的时间按
     *
     * @param time   时间
     * @param format 格式
     * @return
     */
    public static Timestamp getTimestampByStr(String time, SimpleDateFormat format) throws ParseException {
        if (null == time || "".equals(time)) {
            return null;
        }
        return getNowTime(format.parse(time));
    }


    /**
     * 将字符串转为指定格式的时间按
     *
     * @param time 时间
     * @return
     */
    public static Timestamp getTimestampByStr(String time) throws ParseException {
        return getTimestampByStr(time, TIME);
    }

    /**
     * 获取时间戳
     *
     * @param date
     * @return
     */
    public static long getTime(Date date) {
        if (date == null) {
            return 0;
        }
        return date.getTime();
    }

    /**
     * 获取指定日期的指定日期
     *
     * @param time 时间
     * @param day  需要指定的天数(正数为往后，负数为往前)
     * @return
     */
    public static Timestamp getDay(Timestamp time, int day) {
        Calendar c = Calendar.getInstance();
        c.setTime(time);
        c.add(Calendar.DATE, day);
        Date d = c.getTime();
        return getNowTime(d);
    }

    /**
     * 获取指定当前日期的指定日期
     *
     * @param day 需要指定的天数(正数为往后，负数为往前)
     * @return
     */
    public static Timestamp getDay(int day) {
        Calendar c = Calendar.getInstance();
        c.setTime(getNowTime());
        c.add(Calendar.DATE, day);
        Date d = c.getTime();
        return getNowTime(d);
    }


    /**
     * 获取指定日期的指定日期
     *
     * @param time  时间
     * @param month 需要指定的月份数(正数为往后，负数为往前)
     * @return
     */
    public static Timestamp getMonth(Timestamp time, int month) {
        Calendar c = Calendar.getInstance();
        c.setTime(time);
        c.add(Calendar.MONTH, month);
        Date d = c.getTime();
        return getNowTime(d);
    }

    /**
     * 获取指定当前日期的指定日期
     *
     * @param month 需要指定的月份数(正数为往后，负数为往前)
     * @return
     */
    public static Timestamp getMonth(int month) {
        Calendar c = Calendar.getInstance();
        c.setTime(getNowTime());
        c.add(Calendar.MONTH, month);
        Date d = c.getTime();
        return getNowTime(d);
    }


    /**
     * 获取指定日期的指定日期
     *
     * @param time 时间
     * @param year 需要指定的年份数(正数为往后，负数为往前)
     * @return
     */
    public static Timestamp getYear(Timestamp time, int year) {
        Calendar c = Calendar.getInstance();
        c.setTime(time);
        c.add(Calendar.YEAR, year);
        Date d = c.getTime();
        return getNowTime(d);
    }

    /**
     * 获取指定当前日期的指定日期
     *
     * @param year 需要指定的年份数(正数为往后，负数为往前)
     * @return
     */
    public static Timestamp getYear(int year) {
        Calendar c = Calendar.getInstance();
        c.setTime(getNowTime());
        c.add(Calendar.YEAR, year);
        Date d = c.getTime();
        return getNowTime(d);
    }
}
